Tengo una situación en la que los usuarios buscan un "elemento" para que haya "ranuras" disponibles. Los usuarios intentarán llenar un espacio si es posible. Soy nuevo en firebase y estoy bastante seguro de que la forma en que tengo las cosas configuradas no escalará. Funciona solo conmigo probando, pero si hay muchos usuarios, creo que se romperá.
Actualmente está implementado así:
El "elemento" es un objeto en firebase realtime db con un observador establecido en él. Cuando el observador dispara, verifica si el objeto "ranuras" dentro de ese elemento está lleno de usuarios o no. Si está lleno, no debería pasar nada. Si no está lleno, la identificación del usuario se coloca dentro del objeto "ranuras".
La plenitud se determina comparando la longitud actual del objeto "ranuras" con una propiedad/entero "maxLength" adjunto al elemento.
Desafortunadamente, estoy bastante seguro de que lo que sucederá es que todos los usuarios intentarán llenar los espacios al mismo tiempo, y todos detectarán que el elemento no está lleno antes de que alguno de ellos realmente llene los espacios. Por lo tanto, accidentalmente tendré más usuarios en el objeto "ranuras" que el número en "maxLength". ¿Cómo puedo garantizar que eso no sucederá?
Pseudocódigo de lo que tengo (reaccionar nativo):
const item = firebase.database().ref(`item/`); //the item const slots = firebase.database().ref(`item/slots`); //slots within the item item.on('value', (snapshot) => { let data = snapshot.val(); let keys = data.slots ? Object.keys(data.slots) : []; let full = keys.length >= data.maxLength ? true : false; if (!full) { slots.update({ [user.uid]: true }); } });El ejemplo de base de datos en tiempo real se parece más o menos a:
item { maxLength: 10, slots: { rj6h5f7sd88s7f6sdfs7f7: true, //user d466df8dfj8dfjd3nkvmdd: true, //another user // etc. } }